package com.t4.auth.utils;

import com.t4.model.system.SysMenu;
import com.t4.vo.system.MetaVo;
import com.t4.vo.system.RouterVo;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.List;

public class MenuHelper{

    /**
     *  构建树型结构
     * @param sysMenuList 菜单的总节点
     * @return
     */
    public static List<SysMenu> builderTree(List<SysMenu> sysMenuList){
        // 1. 获取根节点
        List<SysMenu> rootNodesList = new ArrayList<>();
        sysMenuList.forEach(i -> {
            if(i.getParentId().longValue() == 0){
                rootNodesList.add(i);
                // 2. 遍历每个根节点，进行递归
                findChildren(sysMenuList, i);

            }
        });
        return rootNodesList;
    }


    /**
     * 寻找子节点
     * @param sysMenuList
     * @param parent
     */
    public static void findChildren(List<SysMenu> sysMenuList, SysMenu parent) {
        // 遍历
        long id = parent.getId().longValue();
        List<SysMenu> children = new ArrayList<>();
        for(SysMenu sysMenu: sysMenuList){
            if(sysMenu.getParentId().intValue() == id){
                children.add(sysMenu);
                findChildren(sysMenuList, sysMenu);
            }
        }
        // 将遍历得到的儿子节点添加到父结点中
        parent.setChildren(children);
    }

    public static List<RouterVo> buildRouter(List<SysMenu> sysMenuTreeList) {
        List<RouterVo> routers = new ArrayList<>();
        for(SysMenu sysMenu: sysMenuTreeList){
            RouterVo router = new RouterVo();
            router.setPath(getRouterPath(sysMenu));
            router.setComponent(sysMenu.getComponent());
            router.setHidden(false);
            router.setAlwaysShow(false);
            router.setMeta(new MetaVo(sysMenu.getName(), sysMenu.getIcon()));
            List<SysMenu> children = sysMenu.getChildren();
            // 如果type=1，则要判断是否有隐藏路由（即hidden=true，但是有component）
            if(sysMenu.getType().intValue() == 1){
                if(!CollectionUtils.isEmpty(children)) {
                    children.forEach(i -> {
                        if (!StringUtils.isEmpty(i.getComponent())) {
                            RouterVo hiddenRouter = new RouterVo();
                            hiddenRouter.setPath(getRouterPath(i));
                            hiddenRouter.setComponent(i.getComponent());
                            hiddenRouter.setHidden(true);
                            hiddenRouter.setAlwaysShow(false);
                            hiddenRouter.setMeta(new MetaVo(i.getName(), i.getIcon()));
                            // 隐藏菜单和一级菜单放一起
                            routers.add(hiddenRouter);
                        }
                    });
                }
            }else{
                if(!CollectionUtils.isEmpty(children)){
                    if(children.size()>0){
                        router.setAlwaysShow(true);
                    }
                    router.setChildren(buildRouter(children));
                }
            }
            routers.add(router);
        }
        return routers;
    }

    /**
     * 获取路由地址
     * @param sysMenu
     * @return
     */
    private static String getRouterPath(SysMenu sysMenu) {
        // 根路径前有 /
        return sysMenu.getParentId().intValue() !=0 ? sysMenu.getPath(): "/" + sysMenu.getPath();
    }
}
